package org.dromara.system.domain.bo;

import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.system.domain.SysFaultInfo;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;

/**
 * 故障信息管理业务对象（复合BO）
 * 用于前端提交故障信息和解决方案的联合操作
 *
 * @author system
 */
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = SysFaultInfo.class, reverseConvertGenerate = false)
public class SysFaultManageBo extends BaseEntity {

    /**
     * 故障ID
     */
    @NotNull(message = "故障ID不能为空", groups = { EditGroup.class })
    private Long faultId;

    /**
     * 机型
     */
    @NotBlank(message = "机型不能为空", groups = { AddGroup.class, EditGroup.class })
    private String excavatorModel;

    /**
     * 故障部分
     */
    @NotBlank(message = "故障部分不能为空", groups = { AddGroup.class, EditGroup.class })
    private String faultPart;

    /**
     * 故障现象
     */
    @NotBlank(message = "故障现象不能为空", groups = { AddGroup.class, EditGroup.class })
    private String faultSymptom;

    /**
     * 详细故障描述
     */
    @NotBlank(message = "详细故障描述不能为空", groups = { AddGroup.class, EditGroup.class })
    private String faultDetail;

    /**
     * 故障备注
     */
    private String remark;

    // ==================== 解决方案相关字段 ====================

    /**
     * 解决方案操作类型
     * - none: 不处理解决方案
     * - upload: 上传新的解决方案文件
     * - link: 关联已存在的解决方案
     * - replace_upload: 替换现有解决方案（上传新文件）
     * - remove: 移除解决方案关联
     * - keep: 保持当前解决方案不变
     */
    private String solutionAction = "none";

    /**
     * 解决方案文档ID（用于关联现有文档）
     */
    private Long linkDocId;

    /**
     * 解决方案文件夹名称（用于上传）
     */
    private String solutionFolderName;

    /**
     * 解决方案备注
     */
    private String solutionRemark;

    /**
     * 是否删除旧的解决方案文档（替换时使用）
     * true: 删除旧文档（如果没有其他故障引用）
     * false: 保留旧文档
     */
    private Boolean deleteOldSolution = true;

    // ==================== 辅助方法 ====================

    /**
     * 转换为故障信息BO
     */
    public SysFaultInfoBo toFaultInfoBo() {
        SysFaultInfoBo faultBo = new SysFaultInfoBo();
        faultBo.setFaultId(this.faultId);
        faultBo.setExcavatorModel(this.excavatorModel);
        faultBo.setFaultPart(this.faultPart);
        faultBo.setFaultSymptom(this.faultSymptom);
        faultBo.setFaultDetail(this.faultDetail);
        faultBo.setRemark(this.remark);
        return faultBo;
    }

    /**
     * 检查是否需要上传解决方案文件
     */
    public boolean needUploadSolution() {
        return "upload".equals(solutionAction) || "replace_upload".equals(solutionAction);
    }

    /**
     * 检查是否需要关联现有解决方案
     */
    public boolean needLinkSolution() {
        return "link".equals(solutionAction) && linkDocId != null;
    }

    /**
     * 检查是否需要移除解决方案
     */
    public boolean needRemoveSolution() {
        return "remove".equals(solutionAction);
    }

    /**
     * 检查是否保持解决方案不变
     */
    public boolean keepSolution() {
        return "keep".equals(solutionAction) || "none".equals(solutionAction);
    }
}
